OpenGL ES을 위한 3D 기본 개념 1 :: OPEN GL ES[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

OPEN GL ES
[1]
등록일:2018-06-24 15:35:01 (0%)
작성자:
제목:OpenGL ES을 위한 3D 기본 개념 1

OpenGL ES을 위한 3D 기본 개념 1

그동안 해오던 것과는 좀 많이 다른 생소한(?) OpenGL 을 공부해보려고 합니다. 기본적인 개념부터 아는게 없으니 생각보다 어려운 느낌이라 개념을 정리해보려고 합니다.

What is OpenGL?

OpenGL 은 Open Graphincs Library 의 약자입니다. 1992년에 실리콘 그래픽스사에서 만들었고, 2D 3D 그래픽스 표준 API 를 지원합니다. Direct 3D 가 Windows 기반에서만 사용된다면 OpenGL 은 여러 플랫폼에서 사용할 수 있도록 되어있고, 이름에 있는 Open 의 의미대로 여러곳에서의 기여, 토론을 통해 업데이트 되기 때문에 Direct 3D 에 비해서는 상대적으로 업데이트가 느립니다. 250여개의 API 를 제공해주고 이 API 들을 통해 점, 선, 삼각형, 사각형, 빛 등을 이용해 화면에 원하는 걸 그려낼 수 있습니다. 즉, OepnGL 이란건 화면에 뭔가 그릴 수 있도록 도와주는 API 들로 이루어진 라이브러리입니다.

접근 시작

화면에 뭔가를 그리려고 합니다. 실제로는 모니터에 뭔가를 보여주는 거겠죠. 우리는 픽셀들이 모여서 하나의 화면으로 보여주는 모니터를 사용합니다. 의도대로 화면에 뭔가를 보여주기 위해서는 화면의 픽셀들을 원하는 대로 채우면 될 것 같네요.

Vertex — 정점

간단하게 점부터 생각을 해봅니다.

정점의 정보를 가지고 있는 data structure 자료구조 입니다. 위치 position 를 나타냅니다. 2D라면 x, y 로 3D라면 x, y, z 로 된 정보를 가지고 있을 겁니다. Vertex 는 위치정보를 포함한 다른 정보들도 가지고 있습니다. 위치 정보를 비롯해 어떻게 보여줄지에 대한 색상 정보 등을 가지고 있습니다. Color 는 보통 RGBA(색의 3원색인 Red, Green, Blue 에 명암을 나타내는 Alpha 값 까지 포함)로 나타냅니다. 일단은 position 과 color 정도만 알면 될 것 같네요.

Polygon — 폐곡선(폐곡선 도형)

두개의 vertex 를 연결하면 선이 됩니다. 세개의 vertex 를 연결하면 삼각형이 되죠. 초창기에는 삼각형과 사각형의 싸움이 있었다고 하지만 요즘에는 물체를 나타낼때 거의 대부분 삼각형을 이어서 표현한다고 하네요. 예를들면 사각형은 두개의 삼각형을 연결해서 표현하는 식이 되는겁니다. 최소 단위는 vertex 가 되겠지만, 면으로 이루어진 최소 단위는 triangle 이 됩니다.

이렇게 vertex 를 연결해서 만든 면을 polygon 폐곡선 이라고 부릅니다.
triangle pan, triangle strip 등 표현하는 방식에는 여러가지가 있는듯 하지만, 지금은 polygon 이 무엇인지만 얼추 알고 넘어갑니다.

Polygon Mesh

Polygon mesh 는 polygon 과 vertex 들이 모여있는 집합입니다. 짧게 mesh 라고도 부릅니다.

Texture

Texture 는 OpenGL 에서 사용하는 object 입니다. Shader 의 입력데이터로 사용되거나 화면에 그려지는 타겟으로 사용됩니다. 좀 단순화 시켜서 화면에 그려질 이미지데이터, shader 처리를 거칠 이미지 데이터라고 생각하고 넘어갑니다.

Shader program

이제 위에서 말한 vertex 정보들을 통해 화면에 우리가 원하는 뭔가를 보여줘야 합니다. Vertex 는 그 자체로 바로 화면에 보여질 수 없으므로 프로그램의 처리를 통해 화면에 보여질 수 있는 정보로 변환 되어야 합니다.

이런 처리를 하는 프로그램을 Shader 라고 합니다.

화면에 실제 보여지는 픽셀 정보로 까지 변환되는데는 여러가지의 Shader program을 사용할 수 있지만 크게는 두가지의 과정을 거칩니다. 일단은 Shader 프로그램 두가지만 알아두면 됩니다.

  • Vertex Shader
  • Fragment(pixel) Shader

GLSL

위에서 언급한 shader 프로그램들은 GLSL 로 작성됩니다.
GLSL 은 OpenGL Shading Language 의 줄임입니다. GLslang 이라고도 합니다. 의미 그대로 shading 을 위한 언어입니다. C언어를 기반으로 변형된 언어입니다. 지금은 이런게 있다는 정도만 알아둡니다.

Vertex Shader

Vertex 정보를 2D 또는 3D 공간에 배치하는 작업을 해줍니다. GLSL 로 작성된 프로그램에 의해 vertex 들의 데이터(vertices or vertexes)를 변환해줍니다. 모든 vertex 를 변환해 주어야 하니 vertex 의 갯수만큼 호출이 될겁니다.

간단한 vertex shader 프로그램 입니다. (안드로이드 OpenGL ES 문서 참조)

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main(){               
// The matrix must be included as part of gl_Position
// Note that the uMVPMatrix factor *must be first* in order
// for the matrix multiplication product to be correct.
gl_Position = uMVPMatrix * vPosition;
}

이런 프로그램의 처리를 통해 vertex 정보들이 변환되는구나 정도만 알아둡니다.

Rasterization

위에서 shader 프로그램 두개를 알아보자고 했지만, 사실 하나의 과정이 더 있네요.
Vertex shader 를 통해 vertices 데이터를 변환합니다. 이렇게 변환되어 처리된 데이터를 Fragment Shader 에서 처리 가능한 (화면 pixel 값 계산을 위한) 정보로 바꿔주는 과정을 레스터화 Rasterization 이라고 합니다. 이런 처리를 하는 녀석을 Rasterizer 라고 부릅니다.

Fragment Shader

Vertex 데이터들을 vertex shader 를 통해 배치하고 rasterizer 를 통해 변환했다면 이제 fragment shader 에서 처리할 차례입니다. Fragment shader 는 vertext shader, rasterizer 를 거친 데이터를 통해 각 픽셀의 값을 결정합니다.

Fragment shader 프로그램은 이런식으로 만들어집니다.

precision mediump float;
uniform vec4 vColor;
void main() {
gl_FragColor = vColor;
}

Renderer

이제 화면에 보여줄 준비를 마쳤습니다. Vertext > Vertext Shader > Rasterizer > Fragment Shader 를 통해 만들어진 데이터를 화면에 보여주는 작업을 rendering 이라고 합니다. 이렇게 데이터들을 화면에 출력해주는 녀석을 renderer 라고 부릅니다.


Rendering pipeline

지금까지 간단하게 압축한 OpenGL 의 몇가지 개념을 살펴 보았습니다. 그 중에서 위에서 언급한 화면에 그려지기까지의 처리과정을 Rendering pipeline 이라고 부릅니다.

Rendering Pipeline

vertex 등의 데이터를 vertex shader 로 처리하고, rasterization 을 거친 뒤 fragment shader 를 통해 픽셀 색상 값으로 변경하고 화면에 그리는(rendering) 것까지입니다.

OpenGL 에는 기본적으로 제공하는 pipeline 도 있고, 직접 pipeline 의 각 과정의 프로그램을 만들어서 사용할수도 있습니다. 직접 처리를 하겠다면 위에서 나온 vertex shader 나 fragment shader 를 직접 프로그래밍해서 pipeline 과정을 거치면 될겁니다.


우선은 이정도로 정리를 해두고 OpenGL을 위한 3D 기본 개념1 을 마칩니다. 
(왠지 2번 글을 쓸것 같은 제목이지만 1로 끝날 수 도 있다는건 함정)


[본문링크] OpenGL ES을 위한 3D 기본 개념 1
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=34659
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.